iT邦幫忙

2023 iThome 鐵人賽

DAY 7
0
AI & Data

用Python程式進行股票技術分析系列 第 7

Day7 移動平均線

  • 分享至 

  • xImage
  •  

移動平均線定義

移動平均線簡稱均線,是技術分析中一種,可以分析時間和股價數據之間關係的工具(技術分析的三種元素:價格、量能、時間;移動平均線是由股價與時間所組成的)。在這邊所談到的移動平均使用的是簡單移動平均,以收盤價的算數平均來計算平均價格。公式/範例:(今日收盤價+前4日收盤價) ÷5=5日均價。
使用移動平均可以讓短期波動平緩,降低誤差值干擾。而移動平均線也代表投資人的平均成本,且移動平均線是客觀的技術分析工具。

移動平均線的參數設定

總共六條均線:使用看盤軟體的「內建參數」,不要去改它:

  • 短期:5日(周線)、10日(雙周線)
  • 中期:20日(月線)、60日(季線)
  • 長期:120日(半年線)、240日(年線)

移動平均線的特性

當移動平均線的角度越大,代表的多空力量越強,但維持時間通常越短。當天期和參數越長,因為加總的樣本數越多,移動均線會越平緩,反之則越多轉折。當天期和參數越長,均線與K線會距離越遠,碰觸的機會越少。

程式實作:移動平均線取得與計算

我們在Day4時就已經取得看盤軟體的移動平均線資料,因此我們很容易地在將它繪製於K線圖上。以下就是在K線圖上繪製20日移動平均線的程式碼:

# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s  = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)

# 設定移動平均線
added_plots={
    "SMA20": mpf.make_addplot(df_sma['SMA20'],width=0.6,color='xkcd:violet')
            }

# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()))
mpf.plot(df_k_line,**kwargs) 

其實這段程式與早先繪製K線圖的程式都是一樣的,因此相關說明請參閱Day5內容。程式執行結果如下所示:
Imgur
另外我們還可以使用計算的方式來取得移動平均線,此處有兩種方式:第一種方式為使用DataFrame型態的rolling函式,第二種方式則是使用talib套件的SMA函式。首先使用第一種方式(DataFrame型態的rolling函式)計算移動平均線並將其繪製於K線圖上,程式碼如下所示:

# 使用DataFrame rolling方式計算20日移動平均
rolling_sma20 = df_k_line['Close'].rolling(window=20).mean()
print(rolling_sma20.values)

# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s  = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)

# 設定移動平均線
added_plots={
    "SMA20": mpf.make_addplot(rolling_sma20,width=0.6,color='xkcd:violet')
            }

# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()))
mpf.plot(df_k_line,**kwargs) 

程式執行結果如下所示:
Imgur
從中可以發現計算出來的移動平均線少了前面幾天(準確來說是少了19天)。原因在於20日移動平均線的第一個有效的移動平均值需要有前面19天的收盤價才能計算,所以只要是在一個區間內計算移動平均線都會遇到相同的情況;稍後介紹的第二種方式也是如此。接下來使用第二種方式(talib套件的SMA函式)計算移動平均線並將其繪製於K線圖上,程式碼如下所示:

# 使用talib套件計算20日移動平均
talib_sma20 = SMA(df_k_line_talib,timeperiod=20)
print(talib_sma20.values)

# 設定K線格式
mc = mpf.make_marketcolors(up='xkcd:light red', down='xkcd:almost black', inherit=True)
s  = mpf.make_mpf_style(base_mpf_style='yahoo', marketcolors=mc)

# 設定移動平均線
added_plots={
    "SMA20": mpf.make_addplot(talib_sma20,width=0.6,color='xkcd:violet')
            }

# 繪出K線圖
kwargs = dict(type='candle', style=s, figratio=(19,10), addplot=list(added_plots.values()))
mpf.plot(df_k_line,**kwargs) 

程式執行結果如下所示:
Imgur

移動平均線做為趨勢工具

從看盤軟體分別觀察短期移動平均線(兩條,分別為5日與10日)、中期移動平均線(兩條,分別為20日與60日)與長期移動平均線(兩條,分別為120與240日),可以得到很明確的短、中與長期的趨勢定義。當5日移動平均線與10日移動平均線的方向都為下(↓↓)時表示短期空頭。當20日移動平均線與60日移動平均線的方向都為下(↓↓)時表示中期空頭。當120日移動平均線與240日移動平均線的方向都為上(↑↑)時表示長期多頭。如下圖所示:
Imgur
兩條移動平均線的判別趨勢方法如下:
↓↓:空頭,↑↑:多頭, ↑↓或↓↑:盤整

程式實作:從移動平均線判斷短、中、長期的趨勢

依據前面所描述的方式,寫一個函式以判斷多空趨勢。程式碼如下:

# 移動平均線趨勢判定程序
def moving_average_trend(sma):
    now_sma  = sma.iloc[-1].to_dict()
    prev_sma = sma.iloc[-2].to_dict()
    # 確認移動平均線方向:↑ : 'u' , ↓ : 'd' , = : '='
    sma5_dir = 'u' if now_sma['SMA5'] > prev_sma['SMA5'] else 'd' if now_sma['SMA5'] < prev_sma['SMA5'] else '='
    sma10_dir = 'u' if now_sma['SMA10'] > prev_sma['SMA10'] else 'd' if now_sma['SMA10'] < prev_sma['SMA10'] else '='
    sma20_dir = 'u' if now_sma['SMA20'] > prev_sma['SMA20'] else 'd' if now_sma['SMA20'] < prev_sma['SMA20'] else '='
    sma60_dir = 'u' if now_sma['SMA60'] > prev_sma['SMA60'] else 'd' if now_sma['SMA60'] < prev_sma['SMA60'] else '='
    sma120_dir = 'u' if now_sma['SMA120'] > prev_sma['SMA120'] else 'd' if now_sma['SMA120'] < prev_sma['SMA120'] else '='
    sma240_dir = 'u' if now_sma['SMA240'] > prev_sma['SMA240'] else 'd' if now_sma['SMA240'] < prev_sma['SMA240'] else '='
    # 短期趨勢
    if sma5_dir == sma10_dir :
        if sma5_dir == 'u' :
            print('短期趨勢:上升')
        elif sma5_dir == 'd' :
            print('短期趨勢:下降')
    else :
        print('短期趨勢:盤整')
    # 中期趨勢
    if sma20_dir == sma60_dir :
        if sma20_dir == 'u' :
            print('中期趨勢:上升')
        elif sma20_dir == 'd' :
            print('中期趨勢:下降')
    else :
        print('中期趨勢:盤整')
    # 長期趨勢
    if sma120_dir == sma240_dir :
        if sma120_dir == 'u' :
            print('長期趨勢:上升')
        elif sma120_dir == 'd' :
            print('長期趨勢:下降')
    else :
        print('長期趨勢:盤整')

利用上述函式判斷某日的短期、中期與長期的趨勢的程式碼於下所示:

# 2023年5月30日移動平均線趨勢判斷
moving_average_trend(df_sma)

詳細程式碼請參照「第七天:移動平均線.ipynb」。

利用移動平均線找尋買賣點

可以利用移動平均穿越法則來尋找買賣點:

  • 黃金交叉是指短期移動平均線在長期移動平均線上方交叉
  • 死亡交叉是指短期移動平均線在長期移動平均線下方交叉
  • 以黃金交叉做為買點,死亡交叉做為賣點
  • 但在盤整或箱型整理區間,移動平均線的排列會呈現忽上忽下,多線糾結在一起的不規則排列現象,會產生很多無效的買賣點

關於移動平均線買賣點的說明與程式實作,請參照Day21「葛蘭碧八大法則」內容。


上一篇
Day6 價量關係
下一篇
Day 8 直線趨勢線
系列文
用Python程式進行股票技術分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言